20.2 性能

正如你所见,延迟调用远不是一个CALL指令那么简单,会涉及很多内容。诸如对象分配、缓存,以及多次函数调用。在某些性能要求比较高的场合,应该避免使用defer。

test_test.go

package main import ( “sync” “testing” ) var lock sync.Mutex func test() { lock.Lock() lock.Unlock() } func testdefer() { lock.Lock() defer lock.Unlock() } func BenchmarkTest(b *testing.B) { for i := 0; i < b.N; i++ { test() } } func BenchmarkTest2(b *testing.B) { for i := 0; i < b.N; i++ { testdefer() } }

性能测试:

$ go test -v -test.bench . BenchmarkTest-4 100000000 22.0 ns/op BenchmarkTest2-4 20000000 93.4 ns/op

相较以前版本,defer性能有所改进,但还是有4x以上的差异。该结果仅供参考!